package com.CodeBlock代码块.全部优先级;
/**
 * 优先级：//韩顺平390
 * 1.父类的静态代码块和静态属性
 * 2.子类的静态代码块和静态属性
 * 3.父类的普通代码块和普通属性初始化
 * 4.父类的构造方法
 * 5.子类的普通代码块和普通属性初始化
 * 6.子类的构造方法
 * */
public class main {
    public static void main(String[] args) {
        /**1.类加载：
         * 1.1先进性类加载，你要加载B 类，
         * 所以先加载A类，再加载B类，
         * 1.2先加载A 类的静态代码块和静态属性
         * 再加载B 类的静态代码块和静态属性；
         * 类加载结束；
         * 2.创建对象：new B();
         * 2.1找到B 类的构造方法，
         *
         * B(){
         * //super();
         *      |||
         *      VVV
         * super（）隐藏着，调用父类的构造器；
         * A{
         * super（）
         * 调用父类的普通代码块；
         * 调用父类的构造方法；
         * }
         *
         * 返回到 B 类的构造器；
         * 2.2调用本类的普通代码块；
         * 2.3调用本类的构造方法；
         * }
         * */
        new B();
    }
}
class A {
    public static int n1 = geta1();
    public static int geta1(){
        System.out.println("（1）A  的 static  geta1()  被调用");
        return 100;
    }

    static{
        System.out.println("（2）A  的 static代码块 被调用");
    }

    public int n2  = getNum2();
    public int getNum2(){
        System.out.println("（5）A  的  getNum2()  被调用");
        return 200;
    }
    {
        System.out.println("（6）A  的  普通代码块 被调用");
    }

    public A(){
        //super();
        //调用本类的普通代码块和属性；
        System.out.println("（7）A  的  构造器  被调用");
    }

}




class B extends A{
    public static int  b1 = getb1();
    public static int getb1(){
        System.out.println("（3）B  的 static  getb1()  被调用");
        return 100;
    }

    static{
        System.out.println("（4）B  的 static代码块 被调用");
    }

    public  int b2 = getb2();
    public  int getb2(){
        System.out.println("（8）B  的  getb2()  被调用");
        return 200;
    }

    {
        System.out.println("（9）B  的  普通代码块 被调用");
    }

    public B(){
        //super();
        //调用本类的普通代码块和属性；
        System.out.println("（10）B  的  构造器  被调用");
    }
}
